Skip to content

对齐训练:SFT、RLHF 与 DPO ​

标签
AI/infra/对齐
AI/infra/微调
字数
4202 字
阅读时间
17 分钟

14-预训练:数据、稳定性与评估 产出的是 Base Model —— 它把语言规律和世界知识压进了参数里,但它不会「听从指令」。

给 LLaMA-65B 的 Base Model 输入「请解释什么是量子计算」,它可能这么续写:

请解释什么是量子计算?这是一个很好的问题。在许多大学的物理课程中,量子计算都是一个热门话题。以下是一些关于量子计算的常见问题:1. 什么是量子比特?2. 量子纠缠是什么意思?……

它没有回答,而是生成了更多问题。因为在语料里,「问题后面跟更多问题」和「问题后面跟答案」都是常见模式,Base Model 没有理由偏好后者。

这一篇讲把它变成对话助手的两阶段:SFT(学格式)与 偏好优化(学取舍)。PPO 到 GRPO 的算法演进与 Agentic RL 的奖励函数设计在 17-Agentic RL。

要对齐什么 ​

维度含义
有用性(Helpfulness)尽力回答问题、遵循指令要求的格式
无害性(Harmlessness)拒绝生成有害内容、不编造
诚实性(Honesty)不确定时表达不确定(对应 07-模型幻觉)

三个维度会冲突,且冲突时的优先级是有约定的:用户要求「告诉我如何入侵网站」,此时无害性压过有用性。对齐研究的核心工作正是在这些冲突点上定规则 —— 而这个规则由标注规范决定,是人定的,不是从数据里学出来的。

SFT:教它「说话的方式」 ​

损失只算在回答上 ​

SFT 的训练目标和预训练一样是交叉熵,唯一的区别是 mask:

[System]    你是一个有帮助的AI助手。
[User]      请用三句话解释什么是黑洞。
[Assistant] 黑洞是时空中引力极强的区域……

模型看到完整的对话,但损失只在 [Assistant] 之后计算。指令部分是条件,不是要被预测的目标。不 mask 的话模型会学着去生成用户的问题,而不是回答。

SFT 与预训练的目标一样是交叉熵,差别只在 mask:

  输入序列(模型看到完整对话):
    [System]    你是一个有帮助的 AI 助手。
    [User]      请用三句话解释什么是黑洞。
    [Assistant] 黑洞是时空中引力极强的区域……

  ┌──────────────────────────────┬────────────────────────────────┐
  │ 条件部分(不参与损失)         │ 目标部分(算交叉熵)            │
  │ [System] … [User] …           │ [Assistant] 之后的每一个 token  │
  └──────────────────────────────┴────────────────────────────────┘
        loss_mask = 0                   loss_mask = 1

  ⇒ 指令是条件,不是要被预测的目标
  ⇒ 不做 mask,模型会学着去生成用户的问题,而不是回答

Chat Template:角色边界靠特殊 token ​

格式长什么样
ChatML(OpenAI / Qwen)<|im_start|>role\n内容<|im_end|>
LLaMA 2[INST] <<SYS>>\n系统提示\n<</SYS>>\n\n用户消息 [/INST] 回答

模板不只是工程细节 —— 它决定模型「什么时候该说话、什么时候该停」。同一份数据换成不匹配的模板,多轮对话能力会明显退化。这也是推理侧必须用模型自带模板的原因(06-vLLM 部署、参数与服务特性)。

数据从哪来 ​

数据集规模生成方式
Alpaca52KGPT-3.5 生成
ShareGPT~90K 对话用户分享的真实 ChatGPT 对话
OpenAssistant (OASST)~160K 消息社区众包,多语言,带偏好标注
WizardLM Evol-Instruct250KGPT-4「进化」生成(加约束、加深推理步)
UltraChat1.5M 对话GPT-3.5/4 生成

方法上有三类:人工标注(质量最高)、Self-Instruct / Evol-Instruct(用强模型批量造)、开源数据集(直接取用)。Self-Instruct 从少量种子指令出发让模型生成新指令;Evol-Instruct 则对已有指令做「进化」,提高复杂度与多样性。

训练参数与预训练差一个数量级 ​

维度预训练SFT
数据量万亿 token数万到数百万条
学习率~3×10−4~2×10−5
Epoch1–22–5
时间数周到数月数小时到数天

学习率低一个数量级是关键约束:SFT 不希望大幅改变已学到的知识,只想调整输出行为。学得太狠会灾难性遗忘 —— 指令遵循能力上来了,预训练知识掉了。

LIMA 与「表面对齐假说」 ​

LIMA(Meta, 2023)用一个反直觉的结果说明了 SFT 的性质:仅 1,000 条精心挑选的 SFT 数据,就能让模型的对话质量在多个评估维度上接近当时的强模型。

对应的解释是 Superficial Alignment Hypothesis(表面对齐假说):模型的知识与能力几乎全部来自预训练,对齐训练教的是「以什么格式和风格输出已有的知识」。这也解释了为什么 InstructGPT 用 13K 条数据就产生了显著的行为变化,以及为什么 SFT 数据的多样性比数量更关键。

SFT 的根本局限 ​

SFT 是最大似然训练 —— 模型被训练去模仿参考回答。这带来三个结构性短板:

  1. 学到了「回答」的形式,但对「好回答」和「平庸回答」的细微差别不敏感
  2. 只学会了模仿,没学会评判 —— 面对多个可能回答时无法挑最好的
  3. 开放式任务里,参考回答只是众多好答案之一,最大似然会压缩多样性

短板 2 是偏好优化存在的理由。

RLHF:用偏好而非标准答案 ​

核心前提是一句不对称性:人类很难写出最优回答,但很容易判断哪个回答更好。

流程分两阶段。

阶段一:训练奖励模型 ​

数据:对同一条指令,让 SFT 模型生成 4–9 个回答,人类标注员排序或两两比较。

结构:以 SFT 模型初始化,去掉最后的语言模型头,换成一个标量输出头 —— 输入(指令, 回答),输出分数 r(x,y)。

损失(Bradley-Terry 模型):

LRM=−E(x,yw,yl)[log⁡σ(r(x,yw)−r(x,yl))]

其中 yw 是被标注为更好的那个。损失的含义只是「让好回答的分数高于差回答」—— 奖励的绝对数值没有意义,只有相对序有意义。这是后面 DPO 能成立的关键。

数据规模:InstructGPT 约 33K 比较对,LLaMA 2 约 1M 比较对。

奖励模型是整条链路的瓶颈

奖励模型的偏差会原封不动地传给策略模型。标注员倾向认为长回答更「充实」,奖励模型就学会偏好长度,于是策略模型变得啰嗦 —— 这就是 Reward Hacking:模型找到了讨好奖励模型的捷径,而不是真正提升质量。

这类偏差靠「多加数据」解决不了,得改标注规范或改奖励设计(17-Agentic RL 里有奖励函数的三种形态)。

阶段二:PPO 优化策略 ​

maxθ Ex∼D,y∼πθ(y∣x)[r(x,y)−β⋅DKL[πθ(y∣x)∥πref(y∣x)]]
  • πθ:正在训练的策略(语言模型本身)
  • πref:SFT 模型,冻结不动
  • r(x,y):奖励模型打的分
  • β:KL 惩罚系数

KL 项是必需的,不是正则化的锦上添花。 没有它,策略会迅速塌缩到能拿最高分的极端输出模式 —— 奖励模型只在 SFT 分布的邻域内被训练过,跑到分布外它的打分完全不可靠。β 就是这个「允许跑多远」的旋钮。

每一步要跑四遍前向:当前策略生成回答 → 奖励模型打分 → 与参考模型算 KL → PPO 更新。这意味着一轮训练里要同时把四个模型放进显存:策略、参考、奖励模型、价值网络(PPO 的 Critic)。

RLHF 显存≈2×(策略 + Critic)+参考+奖励

这是 RLHF 工程复杂度的主要来源,也是 DPO 想解决的问题。

RLHF 的两阶段,以及阶段二为什么同时要四个模型:

  阶段一:训练奖励模型

    SFT 模型 ──▶ 对同一指令生成 4–9 个回答
                      │
                人类标注排序 / 两两比较
                      │
                以 SFT 初始化,去掉语言模型头,换一个标量输出头
                      │
                输入(指令, 回答)──▶ 分数 r(x, y)
                      │
      Bradley-Terry 损失:让好回答的分数高于差回答
      ⇒ 分数的绝对数值没有意义,只有相对序有意义

  阶段二:PPO 优化策略(四个模型同时驻留显存)

    ┌────────────────┐   ┌────────────────┐
    │ 策略 π_θ       │   │ 参考 π_ref     │   每一步四遍前向:
    │(正在训练)     │   │(SFT,冻结)    │     生成 → 打分 → 算 KL → 更新
    └────────────────┘   └────────────────┘
    ┌────────────────┐   ┌────────────────┐
    │ 奖励模型 r      │   │ Critic(价值)  │   显存 ≈ 2×(策略+Critic) + 参考 + 奖励
    └────────────────┘   └────────────────┘

  ⇒ 这是 RLHF 工程复杂度的主要来源,也是 DPO 想解决的问题

效果 ​

InstructGPT 最常被引用的一组数字:经过 RLHF 的 1.3B 模型,在人类评估中胜过未对齐的 175B GPT-3 —— 参数量差 100 倍以上。

提升集中在四处:复杂指令与多步任务的遵循、有害请求的拒绝、回答的连贯与条理、以及不确定时的表达(07-模型幻觉)。

DPO:把 RL 问题变成分类问题 ​

推导链条 ​

RLHF 的最优策略有闭式解(Rafailov et al., 2023):

π∗(y∣x)=1Z(x)πref(y∣x)exp(1βr(x,y)),Z(x)=∑yπref(y∣x)exp(r(x,y)β)

反解出奖励(这才是关键一步)—— 把上式取对数重排:

r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x)

把右边代入 Bradley-Terry 的偏好概率。注意偏好概率只依赖 r(x,yw)−r(x,yl) 这个差值,而 βlog⁡Z(x) 与 y 无关,在相减时消掉了 —— 这正是 Z(x) 不可解却不妨碍推导的原因。整理后得到:

LDPO=−E[log⁡σ(βlog⁡πθ(yw∣x)πref(yw∣x)−βlog⁡πθ(yl∣x)πref(yl∣x))]

读法很直观:抬高好回答相对参考模型的概率比,压低差回答的概率比。「相对 πref」这个参照是关键 —— 它同时充当了 RLHF 里 KL 项的等效角色,把「别跑太远」的约束内建进了损失。

从 RLHF 的目标函数到 DPO 的损失,四步走完:

  ① RLHF 的目标:max E[ r(x,y) − β·KL(π_θ ‖ π_ref) ]
        │
        │ 这个目标有闭式解
        ▼
  ② π*(y|x) = (1 / Z(x)) · π_ref(y|x) · exp( r(x,y) / β )
        │
        │ 取对数重排 ⇒ 反解出奖励(这才是关键一步)
        ▼
  ③ r(x,y) = β·log[ π*(y|x) / π_ref(y|x) ] + β·log Z(x)
        │
        │ 右边代入 Bradley-Terry 的偏好概率
        ▼
  ④ 偏好概率只依赖 r(x,y_w) − r(x,y_l) 这个差值
        ⇒ β·log Z(x) 与 y 无关,相减时消掉
        ⇒ Z(x) 不可解,也不妨碍推导

  最终损失:
    −E[ log σ( β·log[π_θ(y_w)/π_ref(y_w)] − β·log[π_θ(y_l)/π_ref(y_l)] ) ]

  读法:抬高好回答相对参考模型的概率比,压低差回答的概率比。
       「相对 π_ref」这个参照同时充当了 RLHF 里 KL 项的等效角色 ——
       把「别跑太远」的约束内建进了损失。

与 RLHF 的对比 ​

维度RLHF (PPO)DPO
需要同时驻留的模型4 个(策略 / 参考 / 奖励 / 价值)2 个(策略 / 参考)
算法强化学习分类损失(监督学习)
稳定性对超参敏感,易不稳接近 SFT
采样需要在线采样(每步都要生成)离线数据即可
显存~4× SFT~2× SFT

它不是近似,是同一条目标函数的重新参数化 —— 在偏好数据覆盖的分布内,两者优化的是同一个东西。

局限 ​

DPO 假设偏好数据是离线的:回答来自 πref。训练推进后 πθ 与 πref 越差越远,离线数据不再反映当前策略的行为分布 —— 这是它的理论局限,也是「DPO 训练久了会退化」的根源。

变体各自针对一处:

变体改了什么
IPO换偏好模型,抑制 DPO 在偏好数据上的过拟合
KTO不需要成对比较,只要「好 / 差」的二元标注
ORPO把 SFT 与偏好优化合并成一个阶段
SimPO去掉参考模型,用长度归一化的对数概率做隐式奖励

偏好数据工程 ​

三种标注形态 ​

方式做法权衡
两两比较展示两个回答,选更好的最常用;一致性最高 —— 绝对打分标准因人而异,「哪个更好」的判断更趋一致
排序对 4–9 个回答完整排序信息量大(一次排序产生多个比较对),难度高
属性标注同时标在哪个维度上更好(有用 / 安全 / 真实 / 格式)训练更精细,成本最高

规模:SFT 求质、偏好求量 ​

模型SFT 数据偏好数据方法
InstructGPT~13K~33K 比较对RLHF (PPO)
LLaMA 2 Chat~27K~1M 比较对Rejection Sampling + PPO
Zephyr-7B~200K(UltraChat)~60K(UltraFeedback)DPO
Mistral Instruct未公开未公开DPO

一个可操作的经验:SFT 追求质量(LIMA 的 1,000 条即可见效),偏好数据必须追规模与多样性 —— 因为要覆盖的是「各种场景下的取舍」,场景枚举不足就会出现没见过的情形没有偏好可依。

Rejection Sampling:用模型自己的输出当教材 ​

LLaMA 2 在 RLHF 里用的一招:对每个 prompt 用当前策略生成 K 个回答(如 K=25),奖励模型给全部打分,只留最高分那个作为新的 SFT 数据,再做一轮 SFT。

比直接 PPO 简单稳定,且能吃到更多 prompt。LLaMA 2 的对齐是多轮迭代的:

SFT → Rejection Sampling → RLHF → 用新模型再做 Rejection Sampling → 再 RLHF → …

每一轮都用更好的模型生成更好的数据 —— 这条自举回路是「对齐不是一次性的」的具体表现。

减少人类标注:CAI 与 RLAIF ​

Constitutional AI ​

Anthropic 的思路是用一套明文规则(「宪法」)替代部分人工标注:

  1. Red Teaming —— 用攻击者模型生成有害 prompt
  2. 让模型给出初始回答(可能含有害内容)
  3. 自我批评 —— 按宪法原则评判自己的回答哪里有问题
  4. 自我修正 —— 重写回答使其符合原则
  5. 训练 —— (原始 prompt, 修正后回答) 作 SFT 数据;(原始回答, 修正后回答) 作偏好对做 DPO/RLHF

偏好信号的来源从「人类判断」换成了「规则判断」 —— 规则可审计、可修改,代价是规则的完备性要人负责。

RLAIF ​

用强模型(如 GPT-4)直接充当标注员生成偏好数据。代价是引入标注模型的偏见,好处是成本比人工低一到两个数量级,且能快速扩规模。

相关 ​

参考 ​

部分公式在原站转换中退化为可见文本,已按 InstructGPT 与 DPO 原论文口径重建

贡献者 ​

文件历史 ​